<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="zh" xml:lang="zh" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Guideline: 等价类分析 </title>
<meta name="uma.type" content="Guideline">
<meta name="uma.name" content="equivalence_class_analysis">
<meta name="uma.presentationName" content="等价类分析 ">
<meta name="element_type" content="other">
<meta name="filetype" content="description">
<meta name="role" content="">
<link rel="StyleSheet" href="./../../../css/default.css" type="text/css">
<script src="./../../../scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script><script src="./../../../scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script><script src="./../../../scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script><script src="./../../../scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script><script src="./../../../scripts/contentPage.js" type="text/javascript" language="JavaScript"></script><script type="text/javascript" language="JavaScript">
					var backPath = './../../../';
					var imgPath = './../../../images/';
					var nodeInfo=null;
					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, false, false);
				</script>
</head>
<body>
<div id="breadcrumbs"></div>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td valign="top"><a name="Top"></a>
<div id="page-guid" value="3.8675740383428907E-305"></div>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td class="pageTitle" nowrap="true">Guideline: 等价类分析 </td><td width="100%">
<div align="right" id="contentPageToolbar"></div>
</td><td width="100%" class="expandCollapseLink" align="right"><a name="mainIndex" href="./../../../index.htm"></a><script language="JavaScript" type="text/javascript" src="./../../../scripts/treebrowser.js"></script></td>
</tr>
</table>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td class="pageTitleSeparator"><img src="./../../../images/shim.gif" alt="" title="" height="1"></td>
</tr>
</table>
<div class="overview">
<table width="97%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="50"><img src="./../../../images/guidance.gif" alt="" title=""></td><td>
<table class="overviewTable" border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top">等价类分析是将测试用例的数目减到最少的技术。本指南介绍这种技术并说明如何使用它。</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<div class="sectionHeading">Relationships</div>
<div class="sectionContent">
<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
<tr valign="top">
<th class="sectionTableHeading" scope="row">Related Elements</th><td class="sectionTableCell">
<ul>
<li>
<a href="./../../../rup/domains/test_FBB424F8.html" guid="_SPvXcN7IEdm8G6yT7-Wdqw">测试</a>
</li>
<li>
<a href="./../../../rup/workproducts/rup_test_ideas_list_2A0F8E03.html" guid="{45219F27-0F84-4FD5-A7BC-73C19226303B}">测试构想列表</a>
</li>
<li>
<a href="./../../../rup/workproducts/rup_test_case_8AFEC963.html" guid="{D525758B-EBA2-4F59-9BA6-226820C27ADD}">测试用例</a>
</li>
<li>
<a href="./../../../rup/workproducts/rup_workload_analysis_model_E86A32FF.html" guid="{008164B1-3AC3-47E8-9F93-EE4C36B58A97}">工作负载分析模型</a>
</li>
<li>
<a href="./../../../rup/tasks/identify_test_ideas_395DAB3B.html" guid="{6FAD9DF9-DE4E-4BA5-9B9B-482A2366D1B9}">确定测试构想</a>
</li>
</ul>
</td>
</tr>
</table>
</div>
<div class="sectionHeading">Main Description</div>
<div class="sectionContent">
<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
<tr valign="top">
<td class="sectionTableSingleCell"><a id="Top" name="Top"></a><a id="XE_runtime_observation_&_analysis__concept" name="XE_runtime_observation_&_analysis__concept"></a>
<h3>
    <a id="Introduction" name="Introduction">简介</a>
</h3>
<p>
    除了最琐碎的软件应用程序之外，通常我们认为，对于一个软件系统，不可能测试所有在逻辑上可行的输入组合。 所以，选择一个好的子集，以尽可能发现最多的错误，这是测试人员要承担的一项有意义且重要的任务。
</p>
<p>
    基于等价类分析（同义词：<i>等价划分</i>、<i>域分析</i>）进行测试是黑匣测试分析的一种形式，它尝试将潜在测试总数减少到数量最少的一组测试，同时又要发现尽可能多的错误 [<a class="elementLinkWithUserText" href="./../../../rup/customcategories/references_56F06DFD.html#MYE79" guid="7.755968586980351E-308">MYE79</a>]。 此方法将输入和输出的集合划分为有限数量的<i><a class="elementLinkWithUserText" href="./../../../rup/guidances/termdefinitions/equivalence_class_9F855392.html" guid="_yHz8QNnmEdmO6L4XMImrsA">等价类</a></i>，以支持为每一类选择有代表性的测试值。由某一个类的代表值生成的测试被认为“等价于”同一个类中其他值生成的测试。如果在代表值的测试中找不到错误，则认为所有其他“等价”值也不会确定任何错误。
</p>
<p>
    等价类的性能在于它们能够指导测试员使用取样策略减少可能必要的测试组合的组合性激增。 该技术提供一个逻辑库，通过该库可以选择所有想得到的测试总数的一部分。 以下是针对大量测试的某些种类的问题域，这些测试可因为考虑等价类而获益：
</p>
<ol>
    <li>
        自变量的组合
    </li>
    <li>
        基于分层关系的因变量
    </li>
    <li>
        基于临时关系的因变量
    </li>
    <li>
        基于市场典型的群集关系
    </li>
    <li>
        可进行建模的复杂关系
    </li>
</ol>
<h3>
    <a id="Strategies" name="Strategies">策略</a>
</h3>
<p>
    可用于等价划分测试的策略和技术有多种。下面是一些示例：
</p>
<h4>
    <a id="EquivalenceClassPartition" name="EquivalenceClassPartition">等价类划分</a>
</h4>
<p>
    由 Glenford Myers 提议的等价划分理论 [<a class="elementLinkWithUserText" href="./../../../rup/customcategories/references_56F06DFD.html#MYE79" guid="7.755968586980351E-308">MYE79</a>]
    尝试通过将输入条件划分为数量有限的等价类，来减少必要的测试用例总数。 等价类分为两种：程序的有效输入集合被看作<i>有效等价类</i>，而所有其他输入均包括在<i>无效等价类</i>中。
</p>
<p>
    以下是用来确定等价类的一组指南：
</p>
<ol>
    <li>
        如果输入条件指定了值的范围（例如，程序“接受 10-100 范围内的值”），那么就确定了一个有效等价类（10-100）和两个无效等价类（小于 10 和大于 100）。
    </li>
    <li>
        如果输入条件指定了一组值（例如“布料可以有许多颜色：红、白、黑、绿、棕”），那么就确定了一个有效等价类（有效值）和一个无效等价类（所有其他无效值）。 有效等价类的每个值均应单独处理。
    </li>
    <li>
        如果输入条件被指定为“应达”状态（例如“输入字符串必须是大写”），那么就确定了一个有效等价类（大写字符）和一个无效等价类（除大写字符外的所有其他输入）。
    </li>
    <li>
        在任务执行之前“很久”就完成的所有事物都是等价类。在程序完成之前某个很短的时间间隔内执行的所有事物是另一类。 恰好在程序开始另一操作之前执行的所有事物是另外一类。
    </li>
    <li>
        如果指定某一程序处理大小范围为 64M-256M 的内存。那么此大小范围就是一个等价类。任何其他内存大小（即大于 256M 或小于 64M）都不可接受。
    </li>
    <li>
        输出事件的划分在于程序的输入。尽管不同的输入等价类可能有相同类型的输出事件，您仍应区别对待输入等价类。
    </li>
</ol>
<h4>
    <a id="BoundaryValueAnalysis" name="BoundaryValueAnalysis">边界值分析</a>
</h4>
<p>
    在每个等价类中，边界条件标识生成的故障的成功率被认为高于非边界条件。 边界条件是高于或低于每个等价类的边界或“边缘”、但又紧接着边界或边缘的值。
</p>
<p>
    从边界条件生成的测试利用了需要测试的范围的最小值（min）、恰好大于最小值的值（min+）、恰好小于最大值的值（max-）和最大值（max）。 测试边界值时，测试人员针对每个等价类选择少量测试用例。
    对于样本量较小的测试，发现故障的可能性是很高的。 测试人员对某一等价类的值中大量案例进行测试的负担得到了某种缓解，这些类值不太可能使测试结果产生很大差别。
</p>
<p>
    关于选择边界值的一些建议如下：
</p>
<ol>
    <li>
        对于浮点型变量，如果其有效条件是 <code>-1.0</code> 到 <code>1.0</code>，则测试 <code>-1.0</code>、<code>1.0</code>、<code>-1.001</code> 和
        <code>1.001</code>。
    </li>
    <li>
        对于整型变量，如果输入的有效范围是 <code>10</code> 到 <code>100</code>，则测试 <code>9</code>、<code>10</code>、<code>100</code> 和
        <code>101</code>。
    </li>
    <li>
        如果程序希望输入大写字母，则测试边界 A 和 Z。同时要测试 <code>@</code> 和 <code>[</code>，因为在 ASCII 码中，<code>@</code> 正好小于 A，而 <code>[</code>
        正好大于 Z。
    </li>
    <li>
        如果程序的输入或输出是有序集，则注意集合的第一个和最后一个元素。
    </li>
    <li>
        如果输入的总和必须是特定的数（<code>n</code>），则测试总和为 <code>n-1</code>、<code>n</code> 或 <code>n+1</code> 的程序。
    </li>
    <li>
        如果程序接受列表，则测试列表中的值。所有其他值均无效。
    </li>
    <li>
        如果读取或写入某一文件，则检查该文件中的第一个和最后一个字符。
    </li>
    <li>
        钱的最小面值是一分或等价的面额。如果程序接受的特定范围为 a 到 b，则测试 a<code>-0.01</code> 和 b<code>+0.01</code>。
    </li>
    <li>
        对于有多个范围的变量，每个范围就是一个等价类。如果子范围不重叠，则测试边界值、上边界以上和下边界以下的值。
    </li>
</ol>
<h4>
    <a id="SpecialValues" name="SpecialValues">特殊值</a>
</h4>
<p>
    尝试先前的两个边界分析策略之后，有经验的测试员将观察程序输入以发现任何“特殊值”的情况，也可能很容易又从中发现软件故障。 下面是一些示例：
</p>
<ol>
    <li>
        对于整型，如果零在有效等价类中，则应始终测试零。
    </li>
    <li>
        测试时间时（时、分和秒），59 和 0 应始终作为每个字段的上边界和下边界进行测试，无论输入变量有什么约束。 这样，除了输入的边界值外，-1、0、59 和 60 应始终作为测试用例。
    </li>
    <li>
        测试日期时（年、月和日），应涉及到几种测试用例，例如特定月份中的天数、闰年二月的天数以及非闰年二月的天数。
    </li>
</ol>
<h4>
    <a id="CategoryPartition" name="CategoryPartition">“类别划分”方法</a>
</h4>
<p>
    <a href="#OstrandBalcer">Ostrand 和 Balcer</a> [16] 开发了一种分区方法，该方法可帮助测试人员分析系统规约、编写测试脚本以及管理它们。
    与主要注重代码的普通策略不同，它们的方法还基于规约和设计信息。
</p>
<p>
    此方法的主要好处在于其能够在代码编写之前就暴露错误，因为输入源是规约且测试源于该规约的分析。 规约中的故障会尽早被发现，通常早在规约在代码中实现之前。
</p>
<p>
    “类别划分”方法的策略如下：
</p>
<ol>
    <li>
        分析规约：将系统功能分解成功能单元，这些单元可以通过规约和实现而独立地进行测试。<br />
        由此；<br />
        <br />
        <ol>
            <li>
                确定将影响功能执行的参数和环境条件。参数是功能单元的输入。环境条件是系统状态，它们将影响功能单元的执行。
            </li>
            <li>
                确定参数的特征和环境条件。
            </li>
            <li>
                将特征分为几类，这些类别导致了系统的行为。<br />
                <br />
            </li>
        </ol>将在此阶段发现行为的描述是模糊、矛盾的，并缺少描述。<br />
        <br />
    </li>
    <li>
        将类别划分为几种选择：这些选择是可能发生且无法预期的、不同的可能状况。它们代表某一类别中相同类型的信息。<br />
        <br />
    </li>
    <li>
        确定多种选择之间的关系和约束。不同类别中的选择会相互影响，还影响到测试套件的构建。 添加约束可消除所选择的不同参数和环境之间的矛盾。<br />
        <br />
    </li>
    <li>
        根据类别、选择和约束信息设计测试用例。如果某一选择导致错误，则不要将其与其他选择组合起来创建测试用例。 如果某一选项可通过单个测试进行“充分”测试，那么它就是所做选择的代表或特殊值。
    </li>
</ol>
<h3>
    <a id="FurtherReading" name="FurtherReading">进一步阅读和参考</a>
</h3>
<ol>
    <li>
        Glenford J. Myers, The Art of Software Testing, John Wiley & Sons, Inc., New York, 1979.
    </li>
    <li>
        White L. J. and Cohen E. I., A domain strategy for computer program testing, IEEE Transaction on Software
        Engineering, Vol. SE-6, No. 3, 1980.
    </li>
    <li>
        Lori A. Clarke, Johnhette Hassell, and Debra J Richardson, A Close Look at Domain Testing, IEEE Transaction on
        Software Engineering, 8-4, 1992.
    </li>
    <li>
        Steven J. Zeil, Faten H. Afifi and Lee J. White, Detection of Linear Detection via Domain Testing, ACM Transaction
        on Software Engineering and Methodology, 1-4, 1992.
    </li>
    <li>
        BingHiang Jeng, Elaine J. Weyuker, A Simplified Domain-Testing Strategy, ACM Transaction on Software Engineering
        and Methodology, 3-3, 1994.
    </li>
    <li>
        Paul C. Jorgensen, Software Testing - A Craftsman's Approach, CRC Press LLC, 1995.
    </li>
    <li>
        Martin R. Woodward and Zuhoor A. Al-khanjari, Testability, fault, and the domain-to-range ratio: An eternal
        triangle, ACM Press New York, NY, 2000.
    </li>
    <li>
        Dick Hamlet, On subdomains: Testing, profiles, and components, SIGSOFT: ACM Special Interest Group on Software
        Engineering, 71-16, 2000.
    </li>
    <li>
        Cem Kaner, James Bach, and Bret Pettichord, Lessons learned in Software Testing, John Wiley & Sons, Inc., New
        York, 2002.
    </li>
    <li>
        Andy Podgurski and Charles Yang, Partition Testing, Stratified Sampling, and Cluster Analysis, SIGSOFT: ACM Special
        Interest Group on Software Engineering, 18-5, 1993.
    </li>
    <li>
        Debra J. Richardson and Lori A. Clarke, A partition analysis method to increase program reliability, SIGSOFT: ACM
        Special Interest Group on Software Engineering, 1981.
    </li>
    <li>
        Lori A. Clarke, Johnette Hassell, and Debra J Richardson, A system to generate test data and symbolically execute
        programs, IEEE Transaction on Software Engineering, SE-2, 1976.
    </li>
    <li>
        Boris Beizer, Black-Box Testing - Techniques for Functional testing of Software and System, John Wiley & Sons,
        Inc., 1995.
    </li>
    <li>
        Steven J. Zeil, Faten H. Afifi and Lee J. White, Testing for Liner Errors in Nonlinear computer programs, ACM
        Transaction on Software Engineering and Methodology, 1-4, 1992.
    </li>
    <li>
        William E. Howden, Functional Program Testing, IEEE Transactions on Software Engineering, Vol. SE-6, No. 2, 1980.
    </li>
    <li>
        <a id="OstrandBalcer" name="OstrandBalcer">Thomas J. Ostrand and Marc J. Balcer</a>, The Category-Partition method
        for specifying and generating functional tests, Communications of ACM 31, 1988.
    </li>
    <li>
        Cem Kaner, Jack Falk and Hung Quoc Nguyen, Testing Computer Software, John Wiley & Sons, Inc., 1999.
    </li>
</ol>
<p>
    &nbsp;
</p><br />
<br /></td>
</tr>
</table>
</div>
<table class="copyright" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="copyright">Copyright &copy; 2008 版权所有 东软集团股份有限公司&nbsp; 联系邮箱:<a href="mailto:tcoe@neusoft.com">tcoe@neusoft.com</a></td>
</tr>
</table>
</td>
</tr>
</table>
</body>
<script type="text/javascript" language="JavaScript">
				contentPage.onload();
			</script>
</html>
